
#ifndef KERNEL_GLOBAL_GDT_H
#define KERNEL_GLOBAL_GDT_H

#include <type.h>

#define GDT_SIZE 128 // 最高8192个，这里128个足够用

// 全局描述符
typedef struct descriptor_t /* 共 8 个字节 */
{
    unsigned short limit_low; // 段界限 0 ~ 15 位
    unsigned int base_low : 24; // 基地址 0 ~ 23 位 16M
    unsigned char type : 4; // 段类型
    unsigned char segment : 1; // 1 表示代码段或数据段 0 表示系统段
    unsigned char DPL : 2; // Descriptor Privilege Level 描述符特权级 0 ~ 3
    unsigned char present : 1; // 存在位，1 在内存中，0 在磁盘上
    unsigned char limit_high : 4; // 段界限 16 ~ 19 位
    unsigned char available : 1; // 该位都安排掉了，送给操作系统吧，无实际作用。
    unsigned char long_mode : 1; // 64 位扩展标志
    unsigned char big : 1; // 32 位 16 位
    unsigned char granularity : 1; // 粒度 4KB 或 1B
    unsigned char base_high : 4; // 基地址 24 ~ 31 位
}__attribute__((packed)) Descriptor_t;

// 段选择子，不一定会用
typedef struct selector_t
{
    u8 RPL : 2; // Request Privilege Level
    u8 TI : 1;  // Table Indicator
    u16 index : 13; // 选择子最多2^13=8192，所以段描述符最多8192个
} Selector_t;

// 全局描述符表指针
typedef struct pointer_t
{
    u16 limit;
    u32 base;
} _packed Pointer_t;

void GdtInit();

#endif
